﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using BF.IBLL.BaseSystem.AreaManagement;
using Base.Core.UnityFactory;

namespace BF.Web.pages.UserControls
{
    public partial class SysAreaTree : System.Web.UI.UserControl
    {
        #region 接口

        private readonly Isys_AreaBLL iBLL = IOCFactory.GetIOCResolve<Isys_AreaBLL>();
        
        #endregion 接口

        #region 系统事件

        protected void Page_Load(object sender, EventArgs e)
        {

            if (IsPostBack)
            {
                string script = string.Format("if('undefined'!=typeof {0}) {0}.reload();", this.ClientID);
                ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "reload", script, true);
            }
            BF.Model.sys_Area modelArea = iBLL.GetModelByID(this.RootAreaCode); //根据AreaCode查询Area实体
            if (modelArea != null)
            {
                //把根节点的地区编码和地区名称传到前台
                this.hidRootCode.Value = modelArea.sID;
                this.hidRootName.Value = modelArea.sName;
            }
        }

        #endregion 系统事件

        #region 属性

        /// <summary>
        /// 设置或获取地区控件中根节点的地区编码。 缺省值：000000
        /// </summary>
        public string RootAreaCode
        {
            get { return hidRootCode.Value; }
            set { hidRootCode.Value = value; }
        }

        /// <summary>
        /// 获取地区控件中选定的地区编码 或设置地区控件中选定的项。
        /// </summary>
        public string SelectedAreaCode
        {
            get { return this.hidSelectedCode.Value; }
            set
            {
                BF.Model.sys_Area modelArea = iBLL.GetModelByID(value);
                this.hidSelectedCode.Value = modelArea == null ? "" : modelArea.sID;
                this.hidSelectedName.Value = modelArea == null ? "" : modelArea.sName;
            }
        }

        /// <summary>
        /// 获取或设置一个值，该值指示是否启用地区控件。 缺省值:True
        /// </summary>
        public bool Enabled
        {
            get
            {
                return Boolean.Parse(hidEnabled.Value);
            }
            set
            {
                hidEnabled.Value = value.ToString();
            }
        }

        /// <summary>
        /// 获取或设置地区控件的宽度。 缺省值：170
        /// </summary>
        public int Width
        {
            get { return int.Parse(hidWidth.Value); }
            set { hidWidth.Value = value.ToString(); }
        }

        /// <summary>
        /// 获取或设置地区控件下拉框容器的宽度。 缺省值：180
        /// </summary>
        public int ListWidth
        {
            get { return int.Parse(hidListWidth.Value); }
            set { hidListWidth.Value = value.ToString(); }
        }

        /// <summary>
        /// 获取或设置地区控件下拉框容器的高度。 缺省值：280
        /// </summary>
        public int ListHeight
        {
            get { return int.Parse(hidListHeight.Value); }
            set { hidListHeight.Value = value.ToString(); }
        }

        /// <summary>
        /// 获取地区控件中选定的地区名称。
        /// </summary>
        public string SelectedAreaName { get { return this.hidSelectedName.Value; } }
        
        #endregion 属性

        #region 方法

        /// <summary>
        /// 获取某地区节点父级树中的实体。
        /// </summary>
        /// <param name="areaCode">地区节点</param>
        /// <param name="areaLevel">父级树级别</param>
        /// <returns></returns>
        public Model.sys_Area GetModelByLevel(string areaCode, int areaLevel)
        {
            string tempAreaCode = areaCode;
            while (true)
            {
                Model.sys_Area modelArea = iBLL.GetModelByID(tempAreaCode);
                if (modelArea == null || modelArea.iLevel == areaLevel)
                {
                    return modelArea;
                }
                else
                {
                    tempAreaCode = modelArea.sSuperID;
                }
            }
        }

        /// <summary>
        /// 根据地区编码获得地区级别。
        /// </summary>
        /// <param name="areaCode"></param>
        public int GetLevelByAreaCode(string areaCode)
        {
            Isys_AreaBLL iBLL = IOCFactory.GetIOCResolve<Isys_AreaBLL>();
            return iBLL.GetLevelByAreaCode(areaCode);
        }

        #endregion
    }
}